home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / COMMON / console.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  6KB  |  399 lines

  1. /* --------------------------------- console.c ------------------------------ */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* Console keyboard handler (MSDOS).
  8. */
  9.  
  10. #include "fly.h"
  11.  
  12. #include <dos.h>
  13.  
  14. #ifdef DJGPP
  15. #include <pc.h>
  16. #define membyte(a,b) (*(Uchar *)((((Ulong)(a))<<4)  + (b) + 0xe0000000))
  17. #else
  18. #include <conio.h>
  19. #define membyte(a,b) (*(Uchar *)((((Ulong)(a))<<16) + (b)))
  20. #endif
  21.  
  22.  
  23. #define PUSH_SIZE    256
  24.  
  25. static int    FAR push_buf[PUSH_SIZE] = {0};
  26. static int    push_head = 0, push_tail = 0, push_size = 0;
  27.  
  28. extern int FAR
  29. PcPush (int c)
  30. {
  31.     if (push_size == PUSH_SIZE)
  32.         return (1);
  33.  
  34.     push_buf[push_tail++] = c;
  35.     if (push_tail == PUSH_SIZE)
  36.         push_tail = 0;
  37.     ++push_size;
  38.  
  39.     return (0);
  40. }
  41.  
  42. LOCAL_FUNC int NEAR
  43. PcPop (void)
  44. {
  45.     int    c;
  46.  
  47.     if (!push_size)
  48.         return (-1);
  49.  
  50.     c = push_buf[push_head++];
  51.     if (push_head == PUSH_SIZE)
  52.         push_head = 0;
  53.     --push_size;
  54.  
  55.     return (c);
  56. }
  57.  
  58. static Uchar    NEAR tab16[] = "qwertyuiop[]\r";
  59. static Uchar    NEAR tab30[] = "asdfghjkl;";
  60. static Uchar    NEAR tab43[] = "\\zxcvbnm,./";
  61.  
  62. LOCAL_FUNC int NEAR
  63. kSpecial (int c)
  64. {
  65.     int k;
  66.  
  67.     switch (c) {
  68.     default:
  69.         k = -1;
  70.         break;
  71.     case 1:
  72.         k = K_ESC + K_ALT;
  73.         break;
  74.     case 16:
  75.     case 17:
  76.     case 18:
  77.     case 19:
  78.     case 20:
  79.     case 21:
  80.     case 22:
  81.     case 23:
  82.     case 24:
  83.     case 25:
  84.     case 26:
  85.     case 27:
  86.     case 28:
  87.         k = tab16[c-16] | + K_ALT;
  88.         break;
  89.     case 30:
  90.     case 31:
  91.     case 32:
  92.     case 33:
  93.     case 34:
  94.     case 35:
  95.     case 36:
  96.     case 37:
  97.     case 38:
  98.     case 39:
  99.         k = tab30[c-30] | + K_ALT;
  100.         break;
  101.     case 43:
  102.     case 44:
  103.     case 45:
  104.     case 46:
  105.     case 47:
  106.     case 48:
  107.     case 49:
  108.     case 50:
  109.     case 51:
  110.     case 52:
  111.     case 53:
  112.         k = tab43[c-43] | + K_ALT;
  113.         break;
  114.     case 59:
  115.     case 60:
  116.     case 61:
  117.     case 62:
  118.     case 63:
  119.     case 64:
  120.     case 65:
  121.     case 66:
  122.     case 67:
  123.     case 68:
  124.         k = K_F1 + (c - 59);
  125.         break;
  126.     case 71:
  127.         k = K_HOME;
  128.         break;
  129.     case 72:
  130.         k = K_UP;
  131.         break;
  132.     case 73:
  133.         k = K_PGUP;
  134.         break;
  135.     case 75:
  136.         k = K_LEFT;
  137.         break;
  138.     case 76:
  139.         k = K_CENTER;
  140.         break;
  141.     case 77:
  142.         k = K_RIGHT;
  143.         break;
  144.     case 79:
  145.         k = K_END;
  146.         break;
  147.     case 80:
  148.         k = K_DOWN;
  149.         break;
  150.     case 81:
  151.         k = K_PGDN;
  152.         break;
  153.     case 82:
  154.         k = K_INS;
  155.         break;
  156.     case 83:
  157.         k = K_DEL;
  158.         break;
  159.     case 84:
  160.     case 85:
  161.     case 86:
  162.     case 87:
  163.     case 88:
  164.     case 89:
  165.     case 90:
  166.     case 91:
  167.     case 92:
  168.     case 93:
  169.         k = K_F1 + (c - 84) + K_SHIFT;
  170.         break;
  171.     case 94:
  172.     case 95:
  173.     case 96:
  174.     case 97:
  175.     case 98:
  176.     case 99:
  177.     case 100:
  178.     case 101:
  179.     case 102:
  180.     case 103:
  181.         k = K_F1 + (c - 94) + K_CTRL;
  182.         break;
  183.     case 104:
  184.     case 105:
  185.     case 106:
  186.     case 107:
  187.     case 108:
  188.     case 109:
  189.     case 110:
  190.     case 111:
  191.     case 112:
  192.     case 113:
  193.         k = K_F1 + (c - 104) + K_ALT;
  194.         break;
  195.     case 115:
  196.         k = K_LEFT | K_CTRL;
  197.         break;
  198.     case 116:
  199.         k = K_RIGHT | K_CTRL;
  200.         break;
  201.     case 117:
  202.         k = K_END | K_CTRL;
  203.         break;
  204.     case 118:
  205.         k = K_PGDN | K_CTRL;
  206.         break;
  207.     case 119:
  208.         k = K_HOME | K_CTRL;
  209.         break;
  210.     case 120:
  211.     case 121:
  212.     case 122:
  213.     case 123:
  214.     case 124:
  215.     case 125:
  216.     case 126:
  217.     case 127:
  218.     case 128:
  219.         k = '1' + (c - 120) + K_ALT;
  220.         break;
  221.     case 129:
  222.         k = '0' | K_ALT;
  223.         break;
  224.     case 132:
  225.         k = K_PGUP | K_CTRL;
  226.         break;
  227.     case 133:
  228.         k = K_F11;
  229.         break;
  230.     case 134:
  231.         k = K_F12;
  232.         break;
  233.     case 135:
  234.         k = K_F11 | K_SHIFT;
  235.         break;
  236.     case 136:
  237.         k = K_F12 | K_SHIFT;
  238.         break;
  239.     case 137:
  240.         k = K_F11 | K_CTRL;
  241.         break;
  242.     case 138:
  243.         k = K_F12 | K_CTRL;
  244.         break;
  245.     case 139:
  246.         k = K_F11 | K_ALT;
  247.         break;
  248.     case 140:
  249.         k = K_F12 | K_ALT;
  250.         break;
  251.     case 141:
  252.         k = K_UP | K_CTRL;
  253.         break;
  254.     case 143:
  255.         k = K_CENTER | K_CTRL;
  256.         break;
  257.     case 145:
  258.         k = K_DOWN | K_CTRL;
  259.         break;
  260.     case 146:
  261.         k = K_INS | K_CTRL;
  262.         break;
  263.     case 147:
  264.         k = K_DEL | K_CTRL;
  265.         break;
  266.     case 151:
  267.         k = K_HOME | K_ALT;
  268.         break;
  269.     case 152:
  270.         k = K_UP | K_ALT;
  271.         break;
  272.     case 153:
  273.         k = K_PGUP | K_ALT;
  274.         break;
  275.     case 155:
  276.         k = K_LEFT | K_ALT;
  277.         break;
  278.     case 157:
  279.         k = K_RIGHT | K_ALT;
  280.         break;
  281.     case 159:
  282.         k = K_END | K_ALT;
  283.         break;
  284.     case 160:
  285.         k = K_DOWN | K_ALT;
  286.         break;
  287.     case 161:
  288.         k = K_PGDN | K_ALT;
  289.         break;
  290.     case 162:
  291.         k = K_INS | K_ALT;
  292.         break;
  293.     case 163:
  294.         k = K_DEL | K_ALT;
  295.         break;
  296.     }
  297.     return (k);
  298. }
  299.  
  300. static Uchar    NEAR tabCTRL[] = "@abcdefghijklmnopqrstuvwxyz[\\]^_";
  301.  
  302. LOCAL_FUNC int FAR
  303. kread (void)
  304. {
  305.     int    c;
  306.  
  307.     if (-1 != (c = PcPop ()))
  308.         return (c);
  309.  
  310.     if (!kbhit ())
  311.         return (-1);
  312.  
  313. #ifdef DJGPP
  314.     c = getkey ();
  315.     if (c & 0x100)
  316.         c = kSpecial (c & 0x0ff);
  317. #else
  318.     c = getch ();
  319.     if (c == 0)
  320.         c = kSpecial (getch ());
  321. #endif
  322.     else if (c < 32)
  323.         c = tabCTRL[c]| K_CTRL;
  324.  
  325.     return (c);
  326. }
  327.  
  328. LOCAL_FUNC int FAR
  329. kwait (void)
  330. {
  331.     int    esc, c;
  332.  
  333.     while (-1 == (c = kread ()))
  334.         sys_poll (29);
  335.     for (esc = 0; -1 != c; c = kread ())
  336.         if (K_ESC == c)
  337.             esc = 1;
  338.     return (esc);
  339. }
  340.  
  341. LOCAL_FUNC int FAR
  342. kgetch (void)
  343. {
  344.     int    c;
  345.  
  346.     while ((c = kread ()) == -1)
  347.         sys_poll (30);
  348.     return (c);
  349. }
  350.  
  351. static char    kdelay = 0, krate = 0;
  352.  
  353. LOCAL_FUNC int FAR
  354. kinit (char *options)
  355. {
  356.     union REGS    rg;
  357.  
  358.     rg.h.ah = 0x03;        /* get typamatic delay and rate */
  359.     rg.h.al = 0x06;
  360.     int86 (0x16, &rg, &rg);
  361.     kdelay = rg.h.bh;
  362.     krate = rg.h.bl;
  363.  
  364.     rg.h.ah = 0x03;        /* set typamatic delay and rate */
  365.     rg.h.al = 0x05;
  366.     rg.h.bh = 0x00;        /* delay:  [0..3] = [250..1000]ms  */
  367.     rg.h.bl = 0x06;        /* repeat: [00-1f] = [30-2]/sec */
  368.     int86 (0x16, &rg, &rg);
  369.  
  370.     membyte (0x40, 0x17) |= 0x20;        /* Turn NumLock on */
  371.  
  372.     return (0);
  373. }
  374.  
  375. LOCAL_FUNC void FAR
  376. kterm (void)
  377. {
  378.     union REGS    rg;
  379.  
  380.     rg.h.ah = 0x03;        /* set typamatic delay and rate */
  381.     rg.h.al = 0x05;
  382.     rg.h.bh = kdelay;
  383.     rg.h.bl = krate;
  384.     int86 (0x16, &rg, &rg);
  385.  
  386.     membyte (0x40, 0x17) &= ~0x20;        /* Turn NumLock off */
  387. }
  388.  
  389. struct KbdDriver NEAR KbdConsole = {
  390.     "CONSOLE",
  391.     0,
  392.     NULL,    /* extra */
  393.     kinit,
  394.     kterm,
  395.     kread,
  396.     kgetch,
  397.     kwait
  398. };
  399.